package com.kiki.song.service;

import java.util.List;
import java.util.concurrent.BlockingQueue;

import com.kiki.album.domain.Album;
import com.kiki.searchlog.domain.SearchLogDTO;
import com.kiki.singer.domain.Singer;
import com.kiki.song.domain.main.*;
import com.kiki.song.domain.recommend.UserActionEvent;

/**
 * 音乐信息Service接口
 * 
 * @author 林志毅
 * @date 2025-01-08
 */
public interface ISongService 
{
    /**
     * 查询音乐信息
     * 
     * @param songId 音乐信息主键
     * @return 音乐信息
     */
    public SongVo selectSongBySongId(Long songId);

    /**
     * 查询音乐信息列表
     * 
     * @param song 音乐信息
     * @return 音乐信息集合
     */
    public List<SongVo> selectSongList(Song song);

    /**
     * 新增音乐信息
     * 
     * @param song 音乐信息
     * @return 结果
     */
    public int insertSong(SongVo song);

    /**
     * 修改音乐信息
     * 
     * @param song 音乐信息
     * @return 结果
     */
    public int updateSong(SongVo song);

    /**
     * 批量删除音乐信息
     * 
     * @param songIds 需要删除的音乐信息主键集合
     * @return 结果
     */
    public int deleteSongBySongIds(Long[] songIds);

    /**
     * 删除音乐信息信息
     * 
     * @param songId 音乐信息主键
     * @return 结果
     */
    public int deleteSongBySongId(Long songId);

    /**
     * 根据专辑id查询音乐信息
     * @param albumId
     * @return
     */
    List<SongVo> selectSongListByAlbumId(Long albumId);

    List<SongVo> listFavoriteByUserId(Long userId);

    List<SongVo> listHistoryByUserId(Long userId);

    List<SongDTO> getHotSongList();

    List<SongVo> getSongListBySingerId(Long singerId);

    List<SongVo> searchSong(SearchLogDTO searchLogDTO);

    List<Singer> searchSinger(String keyword);

    List<Album> searchAlbum(String keyword);

    List<Song> getWaitingSongList(int[] songIds);

    List<String> getMusicType();

    List<Song> addLikeType(LikeType likeType);

    List<Song> getOffLineRecommendSongs(int userId);

    List<Song> getOnLineRecommendSongs(BlockingQueue<UserActionEvent> event)throws InterruptedException;

    List<Song> getLikeTypeMusic(int userId);

    List<SongDTO> getNewSongs();

    List<TypeSongListCount> getEachTypeSongListCount();
}
